package com.bjsxt.util;

import com.alibaba.fastjson.JSON;
import com.bjsxt.config.geetest.GeetestLib;
import com.bjsxt.config.geetest.GeetestLibResult;
import com.bjsxt.dto.GeetestDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ALIENWARE
 * @version v1.0.0
 * @package : com.bjsxt.util
 * @description :
 * 极验的验证码工具类
 * @create on : 12/21/2023
 **/
@Slf4j
public class GeetestUtil {

    /**
     * 校验极验表单数据
     *
     * @param geetestdto 表单数据对象
     */
    public static void checkFormData(GeetestDto geetestdto, GeetestLib geetestLib, RedisTemplate<String, Object> redisTemplate) {
        // 取出使用的属性值
        String challenge = geetestdto.getGeetestChallenge();
        String validate = geetestdto.getGeetestValidate();
        String seccode = geetestdto.getGeetestSecCode();
        // 验证状态
        int status;
        // 用户 id
        String userId;
        // session必须取出值，若取不出值，直接当做异常退出
        // status = (Integer) request.getSession().getAttribute(GeetestLib.GEETEST_SERVER_STATUS_SESSION_KEY);
        status = Integer.parseInt(redisTemplate.opsForValue().get(GeetestLib.GEETEST_SERVER_STATUS_SESSION_KEY + ':' + geetestdto.getUuid()).toString());
        // userId = (String) request.getSession().getAttribute("userId");
        userId = redisTemplate.opsForValue().get(GeetestLib.GEETEST_SERVER_USER_SESSION_KEY + ':' + geetestdto.getUuid()).toString();
        GeetestLibResult result = null;
        if (status == 1) {
            /*
            自定义参数,可选择添加
                user_id 客户端用户的唯一标识，确定用户的唯一性；作用于提供进阶数据分析服务，可在register和validate接口传入，不传入也不影响验证服务的使用；若担心用户信息风险，可作预处理(如哈希处理)再提供到极验
                client_type 客户端类型，web：电脑上的浏览器；h5：手机上的浏览器，包括移动应用内完全内置的web_view；native：通过原生sdk植入app应用的方式；unknown：未知
                ip_address 客户端请求sdk服务器的ip地址
            */
            // 构建参数
            Map<String, String> paramMap = new HashMap<String, String>();
            paramMap.put("user_id", userId);
            paramMap.put("client_type", "web");
            paramMap.put("ip_address", IpUtils.getIpAddr(ServletUtils.getRequest()));
            result = geetestLib.successValidate(challenge, validate, seccode, paramMap);
        } else {
            result = geetestLib.failValidate(challenge, validate, seccode);
        }
        // 注意，不要更改返回的结构和值类型
        if (result.getStatus() != 1) {
            // 打印异常
            log.error("极验数据验证二次异常: {}", JSON.toJSONString(result, true));
            // 抛出异常
            throw new IllegalArgumentException("极验数据验证二次异常");
        }
    }
}
